




/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Controladores;

import GestorCuota.Cuota;
import GestorCuota.CuotaBD;
import Interfaz.InterfazPagoCuota;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author frpp
 */
public class ControladorCuota {
    
    private static ControladorCuota Instancia=null;// = new Cuota();
   // private Cuota cuota;
    public ArrayList<Cuota> cuotas = new ArrayList<Cuota>();
    
    public int cuotaActiva;

    //private int cuotasActivas;
    
    /**
     * Constructor por defecto. Al ser un singleton el contructor es privado
     * @param void
     * @return void
     */
    private ControladorCuota(){
        cuotas=null;
        cuotaActiva=-1;
       // cuotasActivas=-1;
    }
    
    /**
     * Método que devuelve la única instancia de la clase
     * @param void
     * @return Instancia
     */
    public static ControladorCuota getInstancia() {
        if (Instancia==null){
            Instancia = new ControladorCuota();
        }
        return Instancia;
    }
    
    
    @Override
    /**
     * Sobrecarga del método clone para impedir que se duplique la instancia
     * (Exigencias del patrón Singleton)
     * @param void
     * @return Object
     */
    public Object clone() throws CloneNotSupportedException {
        throw new CloneNotSupportedException(); 
    }
    
    
    /**
     * Método que inicializa el estado de la instancia
     * @param void
     * @return void
     */
    public void inicializar(){
        cuotaActiva=-1;
        cuotas=null;
    }
    
    
    
    
    /**
     * Método que recibe los datos de una Cuota como un vector de String
     * valida la corrección de los datos y, en caso de que sean correctos,
     * crea un objeto Cuota y lo envía a la clase CuotaBD para su
     * inclusión en la Base de Datos. Envía mensajes al usuario avisando del
     * éxito o fracaso de la operación.
     * @param Datos Vector de String
     * @return true si todo se hizo con éxito o false si hubo error bien sea
     * en la validación de datos, bien en el acceso a la Base de Datos.
     */
    
    
    public Boolean addCuota(String [] Datos){
        Cuota cuot;
        //String [] Datos=InterfazJugador.getInstancia().cargarDatosFormulario();
        
        if ((cuot = VerificarDatosCorrectosCuota(Datos))!=null){ // Datos correctos
            if(CuotaBD.getInstancia().addCuota(cuot) != null){
                 cuotas.add(cuot);
                 cuotaActiva=0;
                InterfazPagoCuota.getInstancia().mostrarTablaCuotas(cuotas);
                InterfazPagoCuota.getInstancia().mostrarMensaje("Cuota añadida con éxito.", "OK", 1);
                return true;
            }else{
               InterfazPagoCuota.getInstancia().mostrarMensaje("Cuota no añadida con éxito.", "Error", 0); 
            } 
        }else{
          InterfazPagoCuota.getInstancia().mostrarMensaje("Error en los datos.", "Error", 0); 
        } 
            return false;    
    }
    
    
    
    /**
     * Método que recibe como entrada una cadena 
     * para buscar cuotas en la Base de Datos datos
     * comienzen por dichas cadenas.
     * En caso de error envía mensajes al usuario avisando fracaso de la operación.
     * En caso de éxito modifica la interfaz para mostrar los datos.
     * @param String [] datos.
     * @return true si se encontraron jugadores, false si no.
     */
    
    
    public Boolean getCuota(int  anioNacimiento, String temporada){
         ArrayList<Cuota> aux = new ArrayList<Cuota>();
            
         cuotas = CuotaBD.getInstancia().getCuota(temporada,anioNacimiento);
         
         if( !cuotas.isEmpty()){// Si la búsqueda es correcta
             InterfazPagoCuota.getInstancia().mostrarTablaCuotas(cuotas);
             //InterfazPagoCuota.getInstancia().mostrarMensaje("Éxito en la búsqueda. ", "ëxito", 1);
             return true;
         }else{
            InterfazPagoCuota.getInstancia().mostrarMensaje("Error en la búsqueda. Pruebe con otros datos", "Error", 0);
         }
        return false; 
    }
    
    
    
    
    /**
     * Método que recibe los datos de un Cuota a modificar como un vector
     * de String valida la corrección de los datos y, en caso de que sean
     * correctos, los envía a la clase CuotaBD para su modificación en la
     * Base de Datos.
     * Envía mensajes al usuario avisando del éxito o fracaso de la operación.
     * @param Datos Vector de String
     * @return true si todo se hizo con éxito o false si hubo error bien sea
     * en la validación de datos, bien en el acceso a la Base de Datos.
     */
    
    
    public Boolean updateCuota(String [] Datos){
        Cuota cuot;
        
        if ((cuot=VerificarDatosCorrectosCuota(Datos))!=null){ // Datos correctos
            // Se completa el nuevo Jugador jug con idJugador
            // Enviar a la BD
            if (CuotaBD.getInstancia().updateCuota(cuot)){ // Modificado con éxito
                cuotas.remove(cuotaActiva);      
                cuotas.add(cuot);
                InterfazPagoCuota.getInstancia().mostrarTablaCuotas(cuotas);
                InterfazPagoCuota.getInstancia().mostrarMensaje("Cuota modificado con éxito","OK", 1);
                return true;
            } else {
                InterfazPagoCuota.getInstancia().mostrarMensaje("Error al modificar la cuota en la Base de Datos.\nIntentelo de nuevo.", "Error en la Base de Datos", 0);
                return false;
            }
        } else {
            // Error con los datos
            InterfazPagoCuota.getInstancia().mostrarMensaje("Error en los datos introducidos.", "Error", 0);
            return false;
        }
    }
    
    
    
    
   /**
	 * 
	 * @return Boolean  True| cuota eliminada    False| cuota eliminada. 
	 */
    /*
	public boolean deleteCuota(){
            
            Boolean salida= false;
            if(CuotaBD.getInstancia().deleteCuota(cuotas[cuotasActivas])) {
                InterfazJugador.getInstancia().mostrarMensaje("Cuota eliminada con éxito", "", 1);
                salida = true;
            }else{
               InterfazJugador.getInstancia().mostrarMensaje("Cuota no eliminada", "ERROR", 0);
            }
            
            return salida;
	}
    */
    
    
    
  
    
    
    
    /**
     * Método que recibe los datos de una Cuota como un vector de String
     * valida la corrección de los datos y, en caso de que sean correctos,
     * crea un objeto Cuota y lo devuelve. Si los datos no son válidos
     * muestra información en la interfaz acerca de cuales son incorrectos.
     * @param Datos Vector de String
     * @return Un objeto Jugador y los datos son correctos o null si no.
     */
    
    public Cuota VerificarDatosCorrectosCuota(String []datos){
        // Si algo incorrecto avisar a la interfaz y mostrar mensaje
        
            Boolean error= false;

            Boolean anioNacimiento=false;
            Boolean cuotadeInscripcion=false;
            Boolean cuotaMensual=false;
            Boolean cuotaTotal=false;
            Boolean temporada = false;
        try {
            try {
                Integer.parseInt(datos[0]);                
            } catch (NumberFormatException ex) {
                anioNacimiento = true;
            }
            
            
            if(Integer.parseInt(datos[0]) <=  0) {
                anioNacimiento = true;
            }
            
            try {
                Double.parseDouble(datos[1]);
            } catch (NumberFormatException ex) {
                cuotadeInscripcion = true;
            }
            
            try {
                Double.parseDouble(datos[2]);
            } catch (NumberFormatException ex) {
                cuotaMensual = true;
            }
            
            try {
                Double.parseDouble(datos[3]);
            } catch (NumberFormatException ex) {
                cuotaTotal = true;
            }

            
                    

            
                
                  Integer.parseInt(datos[4].substring(0, 4));
                  Integer.parseInt(datos[4].substring(5, 9));
             if(!datos[4].contains("-")){
                 temporada = true;
             }        
                     
            } catch (Exception ex) {
                           temporada = true;
            }
                
           
             
        
                    
         
           // int anio = Integer.parseInt(datos[0]);
           // Double ins = Double.parseDouble(datos[1]);
           // Double ins2 = Double.parseDouble(datos[2]);
           // Double ins3 = Double.parseDouble(datos[3]);


            
            //Cuota cuot = new Cuota(anio,  ins, ins2, ins3, datos[4]);
            //cuot.setIdCuota(cuotas.get(cuotaActiva).getIdCuota());
            
            error = (anioNacimiento || cuotadeInscripcion || cuotaMensual || cuotaTotal || temporada);
            
            if (error){
                return null;
            } else {
                Cuota cuot = new Cuota(Integer.parseInt(datos[0]),  Double.parseDouble(datos[1]), Double.parseDouble(datos[2]), Double.parseDouble(datos[3]), datos[4]);
                cuot.setIdCuota(cuotas.get(cuotaActiva).getIdCuota());

                return cuot;
            }
                
        }
    
    
    
      
    public ArrayList<String> getTemporadas(){
    
        ArrayList<String> temporadas;
        
        temporadas = CuotaBD.getInstancia().getTemporadas();
        
        return temporadas;
    }
    
    
    
    
}

